#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

###
# Purpose: this script generates Emacs major mode elisp file for
#          requested Quantum ESPRESSO mode
##

# directories

set basedir [file normalize [file dirname [info script]]]
set topdir  [file normalize [file join $basedir ..]]
set qe_modes_template_dir [file join $topdir GUI QE-modes qe-modes.templates]
			   
set helpdocdir [file join $basedir helpdoc.d]
source [file join $helpdocdir modules.tcl]; # load which modules do we support

set usage "
Usage: 

  either: $argv0  \[OPTIONS\] module1 \[module2 module3 ...\]
  or:     $argv0  \[OPTIONS\] INPUT_*.def \[INPUT_*.def  INPUT_*.def ...\]
  
  Where possible values for modules are:
  
      [::helpdoc::get_supported_modules]

  While INPUT_*.def are what the name suggests.

  OPTIONS are:

  -mode value

        The \"mode\" stands for the short name of the mode, i.e., the
        generated name of the major mode file will be \${mode}-mode.el
        (default value is the same as the name of the command-line
        specified either module or the lowercase spelled PROG part of the
        INPUT_PROG.def file).

  -modename value
         
        The \"modename\" is the textual name of mode; for example if
        mode = pw, then modename can be set to QE-pw.x 
        (default value = QE-\${mode}.x).

  -nmlprefix value

        The \"nmlprefix\" is the prefix character of the fortran namelists 
        (default value = '&').

  -funcs

       If this option is specified then the function \$mode-funcs.el file is generated.

   -cmds list-of-commands

      Add the specified commands as a function names to the major-mode definition.

   -masteronly

       If this option is specified then only the master \$mode-modes.el file is generated.

The $argv0 generates an emacs major-mode elisp file for easier editing 
of input files of specified Quantum ESPRESSO package.
"

# parse command-line

if { $argc < 1 } {
    puts stderr $usage
    exit 1
}

package require cmdline

set options {
    {funcs             "generate $mode-funcs.el file"}
    {masteronly        "generate $mode-modes.el master file"}
    {mode.arg       {} "short name of mode; the corresponding mode file will be named $mode-mode.el"}
    {modename.arg   {} "textual name of mode"}
    {nmlprefix.arg  &  "symbol used for fortran namelist prefix"}
    {cmds.arg       {} "extra commands to be added to the major-mode"}
    {template.arg   {qe-mode.el.tcl} "template for generating the $mode-mode.el file"}
}

set argv_orig $argv

namespace eval ::helpdoc {
    variable opt
    array set opt [::cmdline::getoptions ::argv $options $usage]
    
    if { [llength $::argv] == 0 } {
	puts stderr "
### no module specified on the command line:  [concat $::argv0 $::argv_orig]
"
	exit 1
    }

    puts "
Input specs:
-----------"
    parray opt
    foreach module $argv {    
	puts "module([incr i]) = $module"
    }
    puts ""
}

# load the helpdoc package

source [file join $helpdocdir helpdoc.tcl]

# source the gen-emacs-mode.tcl

source [file join $basedir gen-emacs-mode.tcl]

namespace eval ::helpdoc {

    # for -masteronly generates only the master mode file
    
    if { $opt(masteronly) } {	
	qe_master_generate $argv
	exit 0
    }

    # initialize the qe-mode generation

    qe_mode_init


    # parse each module file ...

    variable module
    foreach module $argv {

	# find whether module is a name of the name of INPUT_*.def file
    
	set deffile $module

	if { ! [file exists $module] } {
	    # seems $module is a module name
	    
	    puts -nonewline "
  trying the $module as a module name ... "

	    set deffile [get_def_filename $module]
	    puts "\[OK\]"
	} else {    
	    # extract module name from INPUT_*.def as:
	
	    set module [modulename_from_defname $deffile]	
	}

	lappend module_list $module
    
	if { $opt(mode) eq {} } {
	    set opt(mode) $module
	}
	if { $opt(modename) eq {} } {
	    set opt(modename) QE-$opt(mode).x
	}
	
	# process this def file
	
	qe_mode_process_def $deffile
    }

    # generate a $opt(mode)-mode.el file
    
    qe_mode_generate $module_list
}


